// 路由鉴权
import router from '@/router'
import NProgress from 'nprogress'
// 引入进度条样式
import 'nprogress/nprogress.css'

NProgress.configure({ trickle: false }) // 取消显示加载小球
// 获取用户相关小仓库
import useUserStore from '@/store/modules/user.ts'
import pinia from '@/store'
// 引入setting配置
import setting from '@/setting.ts'
let userStore = useUserStore(pinia)
// console.log(userStore)
// 全局守卫：项目当中任意路由切换都会触发的钩子
// 全局前置守卫
// router.beforeEach(async (to: any, from: any, next: any) => {
router.beforeEach(async (to: any, _from: any, next: any) => {
  // 加上from参数代码会提示错误，所以我用带下划线的前缀_from代替了from，代码不报错提示了，页面也能正常打开了
  document.title = `${setting.title}-${to.meta.title}` // 设置页面标题
  // 访问某一个路由之前的守卫
  // to：将要访问的路由
  // from：从哪个路由跳转过来
  // next：放行函数
  NProgress.start()
  // 获取token,去判断用户登陆，还是未登陆
  let token = userStore.token
  // 获取用户名字
  let username = userStore.username
  if (token) {
    // 用户已经登陆
    if (to.path == '/login') {
      next({ path: '/' })
    } else {
      // 登陆成功访问其余六个路由
      // 有用户信息
      if (username) {
        next()
      } else {
        // 没有用户信息，在守卫这里发请求获取到了用户信息再放行
        try {
          // 获取用户信息
          await userStore.userInfo()
          // 放行
          // 万一刷新的时候是异步路由，有可能获取到用户信息，异步路由还没有加载完毕,addRoutes 并未完成，出现空白效果
          // 使用 {...to}
          next({ ...to, replace: true })
        } catch (e) {
          // token过期，获取不到用户信息 或者token被手动修改
          // 退出登陆-》清空相关数据
          await userStore.userLogout()
          next({ path: '/login', query: { redirect: to.path } })
        }
      }
    }
  } else {
    // 用户未登陆
    if (to.path == '/login') {
      next()
    } else {
      next({ path: '/login', query: { redirect: to.path } })
    }
  }
})
// 全局后置守卫
// router.afterEach((to: any, from: any) => {
router.afterEach(() => {
  NProgress.done()
})

// 任意路由切换实现进度条  ---NProgress
// 路由鉴权（路由组件访问权限的设置）
// 全部路由组件：登陆|404|任意路由|首页|数据大屏|权限管理（三个子路由）|商品管理（四个子路由）

// 用户未登陆：可以访问login，其余不能访问（指向login）
// 用户登陆成功：不可以访问login【指向首页】, 其余可以访问
